#include <iostream>
#include <vector>
#include <string>
#include <thread>
#include <pthread.h>
#include <unistd.h>

__thread int gval = 100;

void* threadrun(void* args) {
    const char* name = static_cast<const char*>(args);
    pthread_t tid = pthread_self();
    while (true) {
        sleep(1);
        // std::cout << name << " tid: " << tid << " -> to hex ->" << PrintToHex(tid) << std::endl;
        std::cout << name << " thread gval: " << gval << " , &gval: " << &gval << std::endl;
        gval++;
    }   
}


int main() {
    pthread_t tid;
    pthread_create(&tid, nullptr, threadrun, (void*)"new thread");

    while (true) {
        // std::cout << "main get new thread's tid: " << tid << " -> to hex ->" << PrintToHex(tid) << std::endl; 
        std::cout << "main thread gval: " << gval << " , &gval: " << &gval << std::endl;
        sleep(1);
    }

    pthread_join(tid, nullptr);
    return 0;
}

// std::string PrintToHex(pthread_t tid) {
//     char buff[64];
//     snprintf(buff, sizeof(buff), "0x%lx", tid);
//     return buff;
// }

// void* threadrun(void* args) {
//     const char* name = static_cast<const char*>(args);
//     pthread_t tid = pthread_self();
//     while (true) {
//         sleep(1);
//         std::cout << name << " tid: " << tid << " -> to hex ->" << PrintToHex(tid) << std::endl;
//     }
// }


// int main() {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadrun, (void*)"new thread");

//     while (true) {
//         std::cout << "main get new thread's tid: " << tid << " -> to hex ->" << PrintToHex(tid) << std::endl; 
//         sleep(1);
//     }

//     pthread_join(tid, nullptr);
//     return 0;
// }


// void threadrun(std::string name, int num) {
//     while (true) {
//         std::cout << name << " num : " << num << std::endl;
//         sleep(1);
//     }
// }

// int main() {
//     std::thread td1(threadrun, "thread-1", 10);

//     while (true) {
//         sleep(1);
//         std::cout << "main thread run..." << std::endl;
//     }

//     td1.join();
//     return 0;
// }

// const int threadNum = 10;
// // 创建多线程

// void* threadrun(void* args) {
//     std::string* name = static_cast<std::string*>(args);
//     pthread_detach(pthread_self());
//     while (true) {
//         std::cout << name << " thread running..." << std::endl;
//         sleep(1);
//         // pthread_exit(name);
//         // break;
//     }
//     // exit(1);
//     return (void*)name;
// }

// int main() {
//     std::vector<pthread_t> tids;
//     for (int i = 0; i < threadNum; i++) {
//         // 需要new出一个name
//         std::string* name = new std::string("thread");
//         *name += std::to_string(i + 1);
//         pthread_t tid;
//         pthread_create(&tid, nullptr, threadrun, (void*)name);
//         tids.emplace_back(tid);
//     }

//     sleep(3);
//     PTHREAD_CANCELED;
//     for (auto& thread : tids) {
//         // pthread_cancel(thread);
//         std::string* name = nullptr;
//         void* result = nullptr;
//         int n = pthread_join(thread, &result);
//         std::cout << (long long int)result << " quit... n : " << n << std::endl;
//         // delete name;
//     }
//     return 0;
// }


// void* StartNewThread(void* args) {
//     const char* name = static_cast<const char*>(args);
//     int cnt = 5;
//     while (cnt--) {
//         std::cout << name << " running..." << ", pid:" << getpid() << std::endl;
//         sleep(1);

//     }
//     return (void*)name;
// }

// // void func() {
// //     // ....
// // }

// // pthread_create(&tid, nullptr, StartNewThread, (void*)&func);


// int main() {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, StartNewThread, (void*)"new thread");
//     // int a = 0;
//     // pthread_create(&tid, nullptr, StartNewThread, (void*)&a);

//     // std::vector<std::string> vs;
//     // pthread_create(&tid, nullptr, StartNewThread, (void*)&vs);

//     // while (true) {
//     //     std::cout << "main thread running..." << ", pid:" << getpid() << std::endl;
//     //     sleep(1);
//     // }
//     std::cout << PrintToHex(tid) << std::endl;
//     void* ret = nullptr;
//     int n = pthread_join(tid, &ret);
//     if (n == 0)
//         std::cout << "wait thread success..." << std::endl;
//     std::cout << static_cast<const char*>(ret) << std::endl;
//     return 0;
// }